2020年4月20日
By: Chase

input type=number的那些坑

浏览器支持

<input type="number"> 目前主要是chorme支持, safari和IE都不支持. 请注意safari不支持的话, 就意味着在iphone上用chorme也不支持, 因为iphone上的chorme还是safari的内核. 下图为iphone内chorme截图, 图-0

奇葩的是改成type="number"之后, focus之后默认弹出的是数字输入, 但是内容不做任何限制

字符限制

以下为支持该类型时,能允许输入的全部字符. 图-1

如果测试人员比较鸡毛, 坚持认为e, -, +不属于数字类型, 抓紧弃用. 如果你觉得可以加过滤去干掉这几个字符, 参考下一段内容.

Andriod的坑

type="number"很友好的一点就是在手机上访问时, 都会默认弹出数字小键盘或者数字输入区域. 在我测试的android机上, 甚至只能停留在数字输入小键盘上, 不能切换. 但是根据不同的系统, 三星(S6)的小键盘是纯数字的, 不包含- +这种符号, 但是华为(mate 30)的就默认包含- +.

奇葩的是, 此时输入-或者+根本不触发onChange事件, 但是输入纯数字就可以触发. 改成type="text"之后, onChange事件又完美触发了.

顺便说下keyDown, keyUp, keyPress等事件在手机端都不支持.

解决方案

react写法举例:

<input
    value={value}
    type="text"
    onChange={e => {
      if(/^\d*\.?\d*$/.test(e.target.value)) {
        setValue(e.target.value)
      }
    }}
>

简单来说就是正则过滤, 放弃type=number.

Tags: 前端 浏览器兼容 html